package util

import (
	"fmt"
	"math/rand"
	"strconv"
	"strings"
	"time"
)

// GeneratePhoneNumber 生成随机手机号
func GeneratePhoneNumber() string {
	// 预定义的手机号段
	phonePrefixes := []string{"139", "138", "137", "136", "135", "134", "159", "158", "157", "150", "151", "152", "188", "187", "186", "182", "183", "184", "178", "177", "176", "198", "166", "199"}

	// 获取随机的手机号段
	prefix := phonePrefixes[rand.Intn(len(phonePrefixes))]

	// 生成后四位的随机数
	lastFourDigits := rand.Intn(10000)

	// 格式化后四位，确保是四位数，前导0不能省略
	return fmt.Sprintf("%s****%04d", prefix, lastFourDigits)
}

// GenerateOrderNumber 生成随机订单号
func GenerateOrderNumber(num int) string {
	// 获取当前年份
	currentYear := time.Now().Year()

	// 剩余需要生成的随机数的位数
	randomDigitsLength := num - 4 // 长度减去年份的 4 位

	// 生成剩余位数的随机数
	randomDigits := ""
	for i := 0; i < randomDigitsLength; i++ {
		randomDigits += fmt.Sprintf("%d", rand.Intn(10))
	}

	// 拼接并返回订单号
	return fmt.Sprintf("%d%s", currentYear, randomDigits)
}

// GenerateRandomNumber 生成不超过 max 的随机数字，并返回字符串
func GenerateRandomNumber(max int) string {
	// 生成不超过 max 的随机数字
	randomNumber := rand.Intn(max + 1)

	// 将数字转换为字符串并返回
	return strconv.Itoa(randomNumber)
}

// GenerateRandomIP 生成一个随机的完整IPv4地址
func GenerateRandomIP() string {
	// 生成四个 0 到 255 之间的随机数，代表IP地址的每一段
	ipPart1 := rand.Intn(256)
	ipPart2 := rand.Intn(256)
	ipPart3 := rand.Intn(256)
	ipPart4 := rand.Intn(256)

	// 拼接成一个IP地址并返回
	return fmt.Sprintf("%d.%d.%d.%d", ipPart1, ipPart2, ipPart3, ipPart4)
}

// GetRandomElement 传入一个字符串切片，返回其中的随机元素
func GetRandomElement(elements []string) string {
	// 如果切片为空，返回空字符串
	if len(elements) == 0 {
		return ""
	}

	// 从切片中随机选择一个元素
	randomIndex := rand.Intn(len(elements))
	return elements[randomIndex]
}

// GenerateRandomSN 生成随机手机 SN 码
func GenerateRandomSN(snLength int) string {
	const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

	// 设置随机数种子
	rand.Seed(time.Now().UnixNano())

	// 创建一个字符串构建器
	var sb strings.Builder
	sb.Grow(snLength)

	// 随机生成 SN 码
	for i := 0; i < snLength; i++ {
		// 从字符集中随机选择一个字符
		randomIndex := rand.Intn(len(charset))
		sb.WriteByte(charset[randomIndex])
	}

	return sb.String()
}

// GenerateDateTime 根据传入的年月日生成带有当前时分秒的时间字符串
func GenerateDateTime(year, month, day, hour, minute int, nowYmd bool) string {
	// 获取当前的时间
	fmtTime := time.Now()

	// 如果不是自动当前年月日,从参数内取出时间
	if !nowYmd {
		fmtTime = time.Date(year, time.Month(month), day, hour, minute, fmtTime.Second(), 0, fmtTime.Location())
	}

	// 返回格式化后的字符串
	return fmt.Sprintf("%04d年%02d月%02d日 %02d时%02d分%02d秒", fmtTime.Year(), fmtTime.Month(), fmtTime.Day(), fmtTime.Hour(), fmtTime.Minute(), fmtTime.Second())
}
